package RFID;

import com.sun.jna.Library;

/**
 * @author liuxiaobao
 * @date 2022/6/22 9:12
 * 说明：RWOptionService 声明了对YOW-60X系列的读卡器，读和写的相关接口
 */
public interface RWOptionService extends Library {

    int YW_GetReaderID(int ReaderID);
    /**
     * 函数： YW_USBHIDInitial
     * 名称： 免驱USB端口初始化
     * 参数： 无
     * 返回值：>0为成功 ，其它失败
     */
    int YW_USBHIDInitial();

    /**
     * 函数： YW_USBHIDFree
     * 名称： 免驱USB端口释放
     * 参数： 无
     * 返回值：>0为成功，其它失败
     */
    int YW_USBHIDFree();


    /**
     * 函数： YW_Buzzer
     * 名称： 蜂鸣器操作函数
     * 参数： ReaderID：读写器ID号，0为广播地址
     * Time_ON：蜂鸣器响时间，单位0.1s
     * Time_OFF：蜂鸣器不响时间，单位0.1s
     * Cycle：蜂鸣器循环次数
     * 返回值：>=0为成功，其它失败
     */
    int YW_Buzzer(int ReaderID, int Time_ON, int Time_OFF, int Cycle);

    /**
     * 函数： YW_Led
     * 名称： LED灯操作函数
     * 参数： ReaderID：读写器ID号，0为广播地址
     * LEDIndex：选择要操作的LED灯
     * Time_ON： 灯亮的时间，单位0.1s
     * Time_OFF：灯不亮时间，单位0.1s
     * Cycle：   循环次数
     * LedIndexOn：最后要亮的灯 0不亮 1 红灯 2绿灯
     * 返回值：>=0为成功，其它失败
     */
    int YW_Led(int ReaderID, int LEDIndex, int Time_ON, int Time_OFF, int Cycle, int LedIndexOn);

    /**
     * 函数： YW_AntennaStatus
     * 名称： 开启天线，在所有卡操作之前必须开启天线
     * 参数：  ReaderID：读写器ID号，0为广播地址
     * Status: true为开启天线， false为关闭天线
     * 返回值：>=0为成功，其它失败
     */
    int YW_AntennaStatus(int ReaderID, boolean Status);

    /**
     * 函数： YW_SearchCardMode
     * 名称： 寻卡模式设置
     * 参数：  ReaderID：读写器ID号，0为广播地址
     * Mode: 寻卡模式
     * SEARCHMODE_14443A       =    Byte(Char('A'));
     * SEARCHMODE_14443B       =    Byte(Char('B'));
     * SEARCHMODE_15693        =    Byte(Char('1'));
     * SEARCHMODE_ST           =    Byte(Char('S'));
     * SEARCHMODE_AT88RF020    =    Byte(Char('R'));
     * 详细参见说明书
     * 返回值：>=0为成功，其它失败
     */
    int YW_SearchCardMode(int ReaderID, int Mode);

    /**
     * 函数： YW_RequestCard
     * 名称： 寻卡TypeA卡
     * 参数：  ReaderID：读写器ID号，0为广播地址
     * RequestMode: 寻卡模式
     * 所有卡  常数 REQUESTMODE_ALL=$52;
     * 激活的卡 常数 REQUESTMODE_ACTIVE=$26;
     * CardType：输出卡类型
     * 0x4400 -> Ultralight/UltraLight C /MifarePlus(7Byte UID)
     * 0x4200 -> MifarePlus(7Byte UID)
     * 0x0400 ->Mifare Mini/Mifare 1K (S50) /MifarePlus(4Byte UID)
     * 0x0200->Mifare_4K(S70)/ MifarePlus(4Byte UID)
     * 0x4403 ->Mifare_DESFire
     * 0x0800 ->Mifare_Pro
     * 返回值：>=0为成功，其它失败
     */
    int YW_RequestCard(int ReaderID, int RequestMode, short CardType[]);

    /**
     * 函数： YW_AntiCollide
     * 名称： 访冲突操作
     * 参数：  ReaderID：读写器ID号，0为广播地址
     * LenSNO:   输出卡号的长度
     * SNO：  输出卡号
     * 返回值：>=0为成功，其它失败
     */
    int YW_AntiCollide(int ReaderID, byte LenSNO[], byte SNO[]);

    /**
     * 函数： YW_CardSelect
     * 名称： 选卡
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * LenSNO:   要选择卡卡号的长度
     * SNO：  要选择卡卡号
     * 返回值：>=0为成功，其它失败
     */
    int YW_CardSelect(int ReaderID, byte LenSNO, byte SNO[]);

    /**
     * 函数： YW_DownLoadKey
     * 名称： 下载秘钥到读写器中
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * KeyIndex:   秘钥的序号，从0-31
     * Key ：  秘钥指针，6个字节
     * 返回值：>=0为成功，其它失败
     */
    int YW_DownLoadKey(int ReaderID, int KeyIndex, byte Key[]);

    /**
     * 函数： YW_KeyDown_Authorization
     * 名称： 用读写器中的秘钥进行授权
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * KeyMode:  秘钥选择Key A或者Key B
     * 常数  PASSWORD_A           =    $60;
     * 常数  PASSWORD_B           =    $61;
     * BlockAddr：  要授权的块号
     * KeyIndex:   秘钥的序号，从0-31
     * 返回值：>=0为成功，其它失败
     */
    int YW_KeyDown_Authorization(int ReaderID, int KeyMode, int BlockAddr, byte KeyIndex);

    /**
     * 函数： YW_KeyAuthorization
     * 名称： M1卡授权
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * KeyMode:  秘钥选择Key A或者Key B
     * 常数  PASSWORD_A           =    $60;
     * 常数  PASSWORD_B           =    $61;
     * BlockAddr：  要授权的块
     * Key：  秘钥字节指针，6字节
     * 返回值：>=0为成功，其它失败
     */
    int YW_KeyAuthorization(int ReaderID, int KeyMode, int BlockAddr, byte[] Key);

    /**
     * 函数： YW_ReadaBlock
     * 名称： 读取M1卡一个块
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要读取的块号
     * LenData：  要读取的字节数，最大为16
     * Data：  数据指针
     * 返回值：>=0为成功，其它失败
     */
    int YW_ReadaBlock(int ReaderID, int BlockAddr, int LenData, byte pData[]);

    /**
     * 函数： YW_WriteaBlock
     * 名称： 写入M1卡一个块
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要写入的块号
     * LenData：  要读取的字节数，必须为16
     * Data：  数据指针
     * 返回值：>=0为成功，其它失败
     */
    int YW_WriteaBlock(int ReaderID, int BlockAddr, int LenData, byte pData[]);

    /**
     * 函数： YW_Purse_Initial
     * 名称： M1卡将某一块初始化钱包
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要初始化钱包的块号
     * IniValue：  钱包初始化值
     * 返回值：>=0为成功，其它失败
     */
    int YW_Purse_Initial(int ReaderID, int BlockAddr, int IniMoney);

    /**
     * 函数： YW_Purse_Read
     * 名称： 读取M1卡某个块的钱包值
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要初始化钱包的块号
     * Value：  钱包的当前值
     * 返回值：>=0为成功，其它失败
     */
    int YW_Purse_Read(int ReaderID, int BlockAddr, int Money[]);

    /**
     * 函数： YW_Purse_Decrease
     * 名称： 对钱包进行减值操作
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要初始化钱包的块号
     * Decrement：  要减去的值
     * 返回值：>=0为成功，其它失败
     */
    int YW_Purse_Decrease(int ReaderID, int BlockAddr, int Decrement);

    /**
     * 函数： YW_Charge
     * 名称： 对钱包进行加值操作
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   要初始化钱包的块号
     * Charge：    要增加的值
     * 返回值：>=0为成功，其它失败
     */
    int YW_Purse_Charge(int ReaderID, int BlockAddr, int Charge);

    /**
     * 函数： YW_CardHalt
     * 名称： 对M1卡进行Halt操作
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * 返回值：>=0为成功，其它失败
     */
    int YW_CardHalt(int ReaderID);

    /**
     * 函数： YW_Restore
     * 名称： 对钱包进行Restor操作
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   钱包的块号
     * 返回值：>=0为成功，其它失败
     */
    int YW_Restore(int ReaderID, int BlockAddr);

    /**
     * 函数： YW_Transfer
     * 名称： 对钱包进行Transfer操作
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * BlockAddr:   钱包的块号
     * 返回值：>=0为成功，其它失败
     */
    int YW_Transfer(int ReaderID, int BlockAddr);

    /**
     * 函数： YW_AntiCollideAndSelect
     * 名称： 对M1卡进行防碰撞并选卡
     * 参数：  ReaderID：  读写器ID号，0为广播地址
     * MultiCardMode：对多张卡的处理方式
     * 00  返回多卡错误
     * 01  返回一张卡片
     * CardMem：返回卡的内存代码
     * SNOLen: 输出卡号的长度
     * SNO：卡的序列号
     * 返回值：>=0为成功，其它失败
     */
    int YW_AntiCollideAndSelect(int ReaderID, byte ReturnMode, byte CardMem[], byte SNLen[], byte SN[]);


}